home *** CD-ROM | disk | FTP | other *** search
/ Libris Britannia 4 / science library(b).zip / science library(b) / DJGPP / DJSRC111.ZIP / utils / djtart.c next >
C/C++ Source or Header  |  1993-06-30  |  2KB  |  89 lines

  1. #include <stdio.h>
  2. #include <fcntl.h>
  3. #include <sys/stat.h>
  4. #include <string.h>
  5. #include <errno.h>
  6. #include <io.h>
  7. #include <dos.h>
  8. #include <time.h>
  9.  
  10. #include "oread.h"
  11.  
  12. void Fatal(char *msg)
  13. {
  14.   fprintf(stderr, "Fatal! %s!\n", msg);
  15.   exit(1);
  16. }
  17.  
  18. /*------------------------------------------------------------------------*/
  19.  
  20. int v_switch = 0;
  21.  
  22. main(int argc, char **argv)
  23. {
  24.   int i = 1;
  25.   for (; i < argc; i++)
  26.   {
  27.     if (strcmp(argv[i], "-v") == 0)
  28.       v_switch = 1 - v_switch;
  29.     else
  30.       tarlist(argv[i]);
  31.   }
  32. }
  33.  
  34. /*------------------------------------------------------------------------*/
  35.  
  36. typedef struct {
  37.   char name[100];
  38.   char operm[8];
  39.   char ouid[8];
  40.   char ogid[8];
  41.   char osize[11];
  42.   char otime[12];
  43.   char ocsum[8];
  44.   char flags[2];
  45.   char filler[355];
  46. } TARREC;
  47.  
  48. char buf[512];
  49.  
  50. tarlist(char *fname)
  51. {
  52.   TARREC header;
  53.   int r;
  54.   void *f;
  55.   long perm, uid, gid, size, ftime, csum, posn=0;
  56.   int dsize;
  57.   char *changed_name;
  58.   struct tm *ltm;
  59.  
  60.   f = oread_open(fname);
  61.  
  62.   while (1)
  63.   {
  64.     oread_read(f, &header);
  65.     if (header.name[0] == 0)
  66.       break;
  67.     sscanf(header.operm, "%lo", &perm);
  68.     sscanf(header.ouid, "%lo", &uid);
  69.     sscanf(header.ogid, "%lo", &gid);
  70.     sscanf(header.osize, "%lo", &size);
  71.     sscanf(header.otime, "%lo", &ftime);
  72.     if (v_switch)
  73.       printf("%08lx %6lo ", posn, perm);
  74.     else
  75.       printf("%c%c%c%c ",
  76.              perm & 040000 ? 'd' : '-',
  77.              perm & 000400 ? 'r' : '-',
  78.              perm & 000200 ? 'w' : '-',
  79.              perm & 000100 ? 'x' : '-');
  80.     printf("%.20s %9ld %s", ctime(&ftime)+4, size, header.name, posn);
  81.     if (header.flags[1] == 0x32)
  82.       printf(" -> %s", header.filler);
  83.     printf("\n");
  84.     oread_skip(f, (size+511) & ~511);
  85.     posn += 512 + (size+511) & ~511;
  86.   }
  87.   oread_close(f);
  88. }
  89.